// Package repository MySQL仓储实现包，提供基于MySQL的数据持久化实现
package repository

import (
	"context"
	"errors"
	"windsurf-project/internal/domain/entity"

	"gorm.io/gorm"
)

// MySQLUserRepository MySQL用户仓储实现
// 实现了UserRepository接口，提供基于MySQL的用户数据持久化操作
type MySQLUserRepository struct {
	db *gorm.DB // db GORM数据库连接实例
}

// NewMySQLUserRepository 创建新的MySQL用户仓储实例
func NewMySQLUserRepository(db *gorm.DB) *MySQLUserRepository {
	return &MySQLUserRepository{
		db: db,
	}
}

// handleError 处理数据库错误，转换为中文错误消息
func (r *MySQLUserRepository) handleError(err error) error {
	if err == nil {
		return nil
	}

	if errors.Is(err, gorm.ErrRecordNotFound) {
		return errors.New("记录不存在")
	}

	// 处理唯一性约束错误
	if errors.Is(err, gorm.ErrDuplicatedKey) {
		return errors.New("该记录已存在")
	}

	// 其他数据库错误
	return errors.New("数据库操作失败")
}

// Create 创建新用户记录
func (r *MySQLUserRepository) Create(ctx context.Context, user *entity.User) error {
	if err := r.db.WithContext(ctx).Create(user).Error; err != nil {
		return r.handleError(err)
	}
	return nil
}

// GetByID 根据ID获取用户记录
func (r *MySQLUserRepository) GetByID(ctx context.Context, id uint) (*entity.User, error) {
	var user entity.User
	if err := r.db.WithContext(ctx).First(&user, id).Error; err != nil {
		return nil, r.handleError(err)
	}
	return &user, nil
}

// Update 更新用户记录
func (r *MySQLUserRepository) Update(ctx context.Context, user *entity.User) error {
	if err := r.db.WithContext(ctx).Save(user).Error; err != nil {
		return r.handleError(err)
	}
	return nil
}

// Delete 删除用户记录
func (r *MySQLUserRepository) Delete(ctx context.Context, id uint) error {
	if err := r.db.WithContext(ctx).Delete(&entity.User{}, id).Error; err != nil {
		return r.handleError(err)
	}
	return nil
}

// List 获取所有用户记录
func (r *MySQLUserRepository) List(ctx context.Context) ([]*entity.User, error) {
	var users []*entity.User
	if err := r.db.WithContext(ctx).Find(&users).Error; err != nil {
		return nil, r.handleError(err)
	}
	return users, nil
}
